package com.itheima.guava.samples.demo.baseDemo;

import com.google.common.base.Preconditions;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * heckArgument(boolean expression)：用来校验表达式是否为真，一般用作方法中校验参数
 * checkArgument(boolean expression, @Nullable Object errorMessage)：校验表达式是否为真，不为真时显示指定的错误信息。
 * checkArgument(boolean expression, @Nullable String errorMessageTemplate, @Nullable Object... errorMessageArgs)：校验表达式是否为真，不为真时显示错误信息，错误信息中允许使用占位符。
 * checkState(boolean expression)：校验表达式是否为真，一般用作校验方法返回是否为真。
 * checkState(boolean expression, @Nullable Object errorMessage)：当表达式为假的时候，显示指定的错误信息。
 * checkState(boolean expression,@Nullable String errorMessageTemplate,@Nullable Object... errorMessageArgs)：允许在错误信息中使用占位符。
 * checkNotNull(T reference)：校验对象是否为空。
 * checkNotNull(T reference, @Nullable Object errorMessage)：对象为空时显示指定的错误信息。
 * checkNotNull(T reference, @Nullable String errorMessageTemplate,@Nullable Object... errorMessageArgs)：允许在错误信息中使用占位符。
 * checkElementIndex( int index, int size, @Nullable String desc)：校验元素的索引值是否有效，index大于等于0小于size，在无效时显示错误描述信息。
 * checkElementIndex(int index, int size)：错误描述信息为“index”
 * checkPositionIndex(int index, int size, @Nullable String desc)：校验元素的索引值是否有效，index大于等于0小于等于size，在无效时显示错误描述信息。
 * checkPositionIndex(int index, int size)：错误描述信息为“index”
 * checkPositionIndexes(int start, int end, int size)：校验大于等于start，小于end的list的长度是否为size。
 */
public class PreconditionsDemo {

    /**
     * Preconditions：代码校验工具类
     * @param args
     */
    public static void main(String[] args) {

        testPreconditions();
        StringUtilsTest();
    }


    public static void testPreconditions() {

        //checkArgument
        try {
            //校验表达式是否正确，并使用占位符输出错误信息
            Preconditions.checkArgument(1>2,"%s is wrong","1 > 2");
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }


        //checkState
        try {
            //校验表达式是否正确，并使用占位符输出错误信息，使用方法作为表达式
            Preconditions.checkState(testMethod(), "%s is wrong", "testMethod()");
        } catch (IllegalStateException e) {
            System.out.println(e.getMessage()); // testMethod() is wrong
        }


        //checkNotNull
        try {
            //校验对象是否为空，并使用占位符输出错误信息
            Preconditions.checkNotNull(testObject(), "%s is null", "testObject()");
        } catch (NullPointerException e) {
            System.out.println(e.getMessage()); // testObject() is null
        }

        //初始化测试用list
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        //checkElementIndex
        try {
            //校验元素索引是否有效 ，使用checkPositionIndex校验
            Preconditions.checkElementIndex(10, list.size());
            //在临界值size处产生异常
        } catch (IndexOutOfBoundsException e) {
            System.out.println(e.getMessage()); // index (10) must be less than size (10)
        }

        //checkPositionIndex
        try {
            //校验元素索引是否有效，使用checkPositionIndex校验
            Preconditions.checkPositionIndex(10, list.size());
            //在临界size处不产生异常
            System.out.println("checkPositionIndex does not throw IndexOutOfBoundsException");
        } catch (IndexOutOfBoundsException e) {
            System.out.println(e.getMessage()); // checkPositionIndex does not throw IndexOutOfBoundsException
        }
        //checkPositionIndexes
        try {
            //校验是否是有效的索引区间
            Preconditions.checkPositionIndexes(3, 11, list.size());
        } catch (IndexOutOfBoundsException e) {
            System.out.println(e.getMessage()); // end index (11) must not be greater than size (10)
        }

    }

    //测试方法
    private static boolean testMethod() {
        return 1 > 2;
    }

    //测试对象
    private static Object testObject() {
        return null;
    }

    public static void StringUtilsTest(){

        String str = null;

        boolean b = StringUtils.isEmpty("");
        boolean c = StringUtils.isEmpty(null);
        System.out.println(c);
        System.out.println(b);

        if (StringUtils.isEmpty(str)){
            System.out.println("str is null");
        }
    }

}
